#include <bits/stdc++.h>
using namespace std;
// int main() 
// {
//     int x;cin>>x;
//     // cout<<pow(2,x-1)<<endl;
//     int dp[x+1];
//     dp[0]=1;
//     for(int i=1;i<=x;i++)
//     {
//         dp[i]=0;
//         for(int j=1;j<=i;j++)dp[i]+=dp[i-j];
//     }
//     cout<<dp[x]<<endl;
//     return 0;
// }
// int main()
// {
//     string s;cin>>s;
//     int maxlen=0;
//     unordered_map<char,int> mmap;
//     int left=0;
//     for(int right=0;right<s.size();right++)
//     {
//         mmap[s[right]]++;
//         while(mmap.size()>2)
//         {
//             if(mmap[s[left]]--==0)mmap.erase(s[left]);
//             left++;
//         }
//         maxlen=max(maxlen,right-left+1);
//     }
//     cout<<(maxlen)<<endl;
//     return 0;
// }

// class Solution {
//     public:
//         vector<string> Permutation(string str) {
//             vector<string> ret;
//             if(str.empty())return ret;
//             sort(str.begin(),str.end());
//             ret.push_back(str);
//             while(next_permutation(str.begin(), str.end()))
//             {
//                 ret.push_back(str);
//             }
//             return ret;
//         }
//     };

// class Solution {
// public:
//     void dfs(vector<string>&ret,string&str,bool vis[],string curr)
//     {
//         if(curr.size()==str.size())
//         {
//             ret.push_back(curr);
//             return;
//         }
//         for(int i=0;i<str.size();i++)
//         {
//             if(vis[i])continue;

//             if(i>0&&str[i]==str[i-1]&&!vis[i-1])continue;

//             vis[i]=true;
//             dfs(ret,str,vis,curr+str[i]);
//             vis[i]=false;
//         }
//     }
//     vector<string> Permutation(string str) {
//         sort(str.begin(),str.end());
//         bool vis[str.size()];
//         memset(vis,0,sizeof vis);
//         vector<string> ret;
//         dfs(ret,str,vis,"");
//         return ret;
//     }
// };

void dfs(vector<int> ret1,vector<int>&ret,vector<bool>&vis)
{
    if(ret1.size()==ret.size())
    {
        for(auto x:ret1)cout<<x<<" ";
        cout<<endl;
        return;
    }
    for(int i=0;i<ret.size();i++)
    {
        if(vis[i])continue;
        if(i>0&&ret[i]==ret[i-1]&&!vis[i-1])continue;

        vis[i]=true;
        ret1.push_back(ret[i]);
        dfs(ret1,ret,vis);
        ret1.pop_back();
        vis[i]=false;
    }
}
int main()
{
    int n;cin>>n;
    vector<int> ret(n),ret1;
    for(int i=0;i<n;i++)ret[i]=i+1;
    vector<bool> vis(n,false);
    dfs(ret1,ret,vis);
    return 0;
}